﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using System.Threading;

namespace GIFT2
{
    public partial class InterfazFormulario : Form
    {
        public InterfazFormulario()
        {
            //Crea los hilos para presentar el splash screen
            Thread th = new Thread(new ThreadStart(DoSplash));
            th.Start();
            Thread.Sleep(5000);
            th.Abort();
            Thread.Sleep(500);

            InitializeComponent();
            formularioActivo = false;
            nuevo = false;
            guardarComo = false;
            controlFormulario = new ControlFormulario();
        }

        //Operacion que presenta el splash screen
        void DoSplash()
        {
            Splash sp = new Splash();
            sp.ShowDialog();
        }

        private void despliegaFormulario() 
        {
            formulario = new NuevoFormulario(this);

            if (X.Text != "" && Y.Text != "" && nombreFormulario.Text != "")
            {
                if (controlFormulario.verificaNumerico(X.Text) && controlFormulario.verificaNumerico(Y.Text))
                {
                    int x = Convert.ToInt32(X.Text);
                    int y = Convert.ToInt32(Y.Text);
                    formulario.setSize(x, y);
                    if (Foto.Image != null)
                    {
                        formulario.setIcono(icono);
                    }
                    formulario.setTitulo(nombreFormulario.Text);
                    formulario.Show();
                    formularioActivo = true;
                    abrirFormulario.Enabled = false;
                }
            }
        }

        private void CambiaFuente(Label miRotulo)
        {
            FontDialog fd = new FontDialog();
            fd.ShowColor = true;
            fd.Color = Color.Black;
            fd.ShowApply = true;  
            if (fd.ShowDialog() != System.Windows.Forms.DialogResult.Cancel)
                ChangeFont(fd, miRotulo);
        }

        private void ChangeFont(FontDialog fd, Label miRotulo)
        {
            miRotulo.Font = fd.Font;
            miRotulo.ForeColor = fd.Color;
        }
        
        private void abreFormulario(String cualFormulario)
        {
            panelInVisible(true);
            ArrayList atributos = controlFormulario.obtieneAtributosFormulario(cualFormulario);
            if (atributos != null)
            {
                //////////NUEVO//////////////
                cargaComponentes(atributos[1].ToString());
                nombreFormulario.Text = atributos[1].ToString();
                descripcionFormulario.Text = atributos[2].ToString();
                fechaActualizacionFormulario.Text = atributos[3].ToString();
                X.Text = atributos[4].ToString();
                Y.Text = atributos[5].ToString();
            }

            object x = controlFormulario.obtieneIcono(cualFormulario);
            if (x.ToString() == "") { Foto.Image = null; icono = null; }
            else 
            {
                MemoryStream y = new MemoryStream((byte[])x);
                Bitmap img = new Bitmap(y);
                icono = Icon.FromHandle(img.GetHicon());
                Foto.Image = img;
            }
        }

        private void panelInVisible(bool visibilidad) 
        {
            foreach (Control c in panel1.Controls) 
            {
                if (visibilidad) { c.Visible = true; } else { c.Visible = false; }
            }
            guardaComponente.Visible = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            llenarFormularios();
        }

        private void llenarFormularios() 
        {
            ArrayList forms = controlFormulario.obtenerFormularios();
            if (forms != null)
            {
                for (int i = 0; i < forms.Count; ++i) 
                {
                    listaFormularios.Items.Add(forms[i].ToString());
                }
            }
        }

        void nombreFormulario_TextChanged(object sender, System.EventArgs e)
        {
            if (formularioActivo) 
            {
                if (nombreFormulario.Text != "")
                {
                    formulario.setTitulo(nombreFormulario.Text);
                }
            }
            seHicieronCambios();
        }

        void Foto_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            if (Foto.Image != null)
            {
                eliminarIcono.Enabled = true;
                if (formularioActivo)
                {
                    formulario.setIcono(icono);
                }
            }
            else { eliminarIcono.Enabled = false; }
        }

        void Y_TextChanged(object sender, System.EventArgs e)
        {
            seHicieronCambios();
        }

        void listaFormularios_DoubleClick(object sender, System.EventArgs e)
        {
            if (listaFormularios.SelectedItem!=null)
            {
                abreFormulario(listaFormularios.SelectedItem.ToString());
                guardarComoFormulario.Enabled = true;
                guardarFormulario.Enabled = false;
                if (nuevo) { nuevo = false; nombreFormulario.ReadOnly = true; eliminarFormulario.Enabled = true; }
            }
        }

        private void eliminarIcono_Click(object sender, EventArgs e)
        {
            if (Foto.Image != null) 
            {
                Foto.Image = null;
                icono = null;
                if (formularioActivo) 
                {
                    formulario.setIcono(icono);
                }
                eliminarIcono.Enabled = false;
                seHicieronCambios();
            }
        }

        private void agregarIcono_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Title = "Abrir Imagen";
            dlg.Filter = "Windows Bitmap Files (*.bmp)|*.bmp";

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    Bitmap inoco = new Bitmap (dlg.OpenFile());
                    icono = Icon.FromHandle(inoco.GetHicon());
                    Foto.Image = inoco;
                    seHicieronCambios();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("No se puede abrir el archivo: " + ex.Message);
                }
            }

            dlg.Dispose();
        }

        private void abrirFormulario_Click(object sender, EventArgs e)
        {
            despliegaFormulario();
            agregaComponente.Enabled = true;
        }

        private void X_TextChanged(object sender, EventArgs e)
        {
            seHicieronCambios();
        }

        private void cerrarFormulario_Click(object sender, EventArgs e)
        {
            //primero ver si se hicieron cambios y ver si se quiere guardar
            if (formularioActivo)
            {
                formulario.Close();
            }
            limpiaPanel();
            panelInVisible(false);
            if (nuevo) { nuevo = false; nombreFormulario.ReadOnly = true; eliminarFormulario.Enabled = true; }
        }

        private void guardarFormulario_Click_1(object sender, EventArgs e)
        {
            GuardaFormulario(nombreFormulario.Text);
        }

        public void GuardaFormulario(String nombre)
        {
            if (nombre != "")
            {
                if (nuevo)
                {
                    if (!controlFormulario.verificaExistenciaFormulario(nombre))
                    {
                        controlFormulario.guardarFormulario(nombre, descripcionFormulario.Text, X.Text, Y.Text);

                        if (Foto.Image != null)
                        {
                            Bitmap bitmap = new Bitmap(Foto.Image);
                            byte[] photo = (byte[])TypeDescriptor.GetConverter(bitmap).ConvertTo(bitmap, typeof(byte[]));
                            controlFormulario.guardaIcono(photo, nombre);
                        }
                        listaFormularios.Items.Add(nombre);
                        if (nuevo) { guardarFormulario.Enabled = false; nombreFormulario.ReadOnly = true; eliminarFormulario.Enabled = true; nuevo = false; }
                    }
                    else { MessageBox.Show("Ya existe un formulario con ese nombre", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); nombreFormulario.Text = ""; }
                }
                else 
                {   /* SE ESTA HACIENDO UNA MODIFICACION A UN FORMULARIO */

                    ///FALTA VERIFICAR CAMPOS
                    if (!guardarComo)
                    {
                        controlFormulario.actualizaFormulario(nombre, descripcionFormulario.Text, X.Text, Y.Text);
                        if (Foto.Image != null)
                        {
                            Bitmap bitmap = new Bitmap(Foto.Image);
                            byte[] photo = (byte[])TypeDescriptor.GetConverter(bitmap).ConvertTo(bitmap, typeof(byte[]));
                            controlFormulario.guardaIcono(photo, nombre);
                        }
                        else { controlFormulario.eliminaIcono(nombre); }
                        guardarFormulario.Enabled = false;
                    }
                    else 
                    {
                        controlFormulario.guardarFormulario(nombre, descripcionFormulario.Text, X.Text, Y.Text);
                        if (Foto.Image != null)
                        {
                            Bitmap bitmap = new Bitmap(Foto.Image);
                            byte[] photo = (byte[])TypeDescriptor.GetConverter(bitmap).ConvertTo(bitmap, typeof(byte[]));
                            controlFormulario.guardaIcono(photo, nombre);
                        }
                        else { controlFormulario.eliminaIcono(nombre); }
                        listaFormularios.Items.Add(nombre);
                        guardarComo = false;
                    }
                } 
            }
        }

        private void agregaComponente_Click(object sender, EventArgs e)
        {
            bool habilitado = false;
            if (formularioActivo) { habilitado = true; }
            nombreComponente.Enabled = habilitado;
            descripcionComponente.Enabled = habilitado;
            tipoCampoComponente.Enabled = habilitado;
            tipoComponente.Enabled = habilitado;
            anadirComponente.Enabled = habilitado;
        }

        private void tipoComponente_SelectedValueChanged(object sender, EventArgs e)
        {
            if ((((ComboBox)sender).SelectedItem.ToString()).Equals("Rótulo"))
            {
                tipoCampoComponente.Enabled = false;
            }
            else { tipoCampoComponente.Enabled = true; }
        }

        //Captura el evento de agregar un formulario
        private void anadirComponente_Click(object sender, EventArgs e)
        {
            string nombre = nombreComponente.Text;
            if (formularioActivo)
            {
                if (nombreComponente.Text != "" && tipoComponente.Text != "" && (!controlFormulario.verificaExistenciaComponente(nombre, nombreFormulario.Text)))
                {
                    int tamañoLetra = 0;
                    Control control = null;
                    Label label = new Label();
                    label.AutoSize = true;
                    label.Location = formulario.getPunto();
                    label.Name = nombre;
                    label.Text = nombreComponente.Text;
                    CambiaFuente(label);
                    control = label;
                    tamañoLetra = (int)label.Font.Size;

                    Control miControl = null;
                    bool agregaLabel = true;
                    switch (tipoComponente.Text)
                    {
                        case "Rótulo"://Caso de rotulo
                            Label l = new Label();
                            miControl = l;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            break;
                        case "Texto":// Caso de texto
                            TextBox texto = new TextBox();
                            texto.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            texto.Name = "campo" + nombre;
                            miControl = texto;
                            tamañoLetra = (int)texto.Font.Size;

                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "texto", tipoCampoComponente.Text, texto.Name, descripcionComponente.Text, texto.Size.Width.ToString(), texto.Size.Height.ToString(), texto.Location.X.ToString(), texto.Location.Y.ToString(), texto.Font.Name.ToString(), tamañoLetra.ToString(), texto.Font.Style.ToString(), texto.ForeColor.Name.ToString());
                            //recupero a traves de una serie de consultas el campo por defecto correspondiente
                            String idTipoCampo = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(texto.Name, "[id tipo campo]", nombreFormulario.Text);
                            String idTipo = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id texto", "id", idTipoCampo);
                            String campoDefecto = controlFormulario.obtieneAtributoEspecificoTabla("texto", "texto por defecto", "correlativo", idTipo);
                            texto.Text = campoDefecto;//esto se puede cagar en esta vara del resize automatico*/

                            //se debe definir el tamaño del text box, necesito obtener atributo del tipoCampoComponente                            
                            int largoComponente = controlFormulario.getLargoComponenteTipoTexto(tipoCampoComponente.Text);
                            texto.MaxLength = largoComponente;
                            if (largoComponente != 0)
                            {
                                if (largoComponente > 40) //en pixeles
                                {
                                    //lo hacemos multilinea
                                    texto.Multiline = true;
                                    int lineas = (largoComponente / 40);
                                    // ver como funciona y si hay que agregar renglones.
                                    if ((largoComponente % 40) != 0)
                                    {
                                        ++lineas;
                                    }
                                    texto.AcceptsReturn = true;
                                    texto.Height = (texto.Height * lineas) - 4;
                                    largoComponente = 30;
                                }
                                //   Graphics g = Graphics.FromHwnd(texto.Handle);
                                //    SizeF f = g.MeasureString("x", texto.Font);//se escoge un caracter cualquiera para calcular xq tienen diferente ancho
                                int pixelPorCaracter = 8; /*(int)(f.Width);*/
                                texto.Width = largoComponente * pixelPorCaracter;

                                /*controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                                controlFormulario.agregarComponente(nombreFormulario.Text, "texto", tipoCampoComponente.Text, texto.Name, descripcionComponente.Text, texto.Size.Width.ToString(), texto.Size.Height.ToString(), texto.Location.X.ToString(), texto.Location.Y.ToString(), texto.Font.Name.ToString(), tamañoLetra.ToString(), texto.Font.Style.ToString(), texto.ForeColor.Name.ToString());
                                //recupero a traves de una serie de consultas el campo por defecto correspondiente
                                String idTipoCampo = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(texto.Name, "[id tipo campo]", nombreFormulario.Text);
                                String idTipo = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id texto", "id", idTipoCampo);
                                String campoDefecto = controlFormulario.obtieneAtributoEspecificoTabla("texto", "texto por defecto", "correlativo", idTipo);
                                texto.Text = campoDefecto;//esto se puede cagar en esta vara del resize automatico*/
                            }
                            break;
                        case "Lista": //Si es una lista
                            ListBox lista = new ListBox();
                            lista.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            lista.Name = "campo" + nombre;
                            miControl = lista;
                            tamañoLetra = (int)lista.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "lista", tipoCampoComponente.Text, lista.Name, descripcionComponente.Text, lista.Size.Width.ToString(), lista.Size.Height.ToString(), lista.Location.X.ToString(), lista.Location.Y.ToString(), lista.Font.Name.ToString(), tamañoLetra.ToString(), lista.Font.Style.ToString(), lista.ForeColor.Name.ToString());
                            //se le agregan los terminos a la listbox
                            ArrayList terminos = controlFormulario.obtieneTerminosLista(tipoCampoComponente.Text);
                            for (int k = 0; k < terminos.Count; ++k)
                            {
                                lista.Items.Add(terminos[k].ToString());
                            }
                            break;
                        case "FechaHora": //para fecha
                            DateTimePicker fecha = new DateTimePicker();
                            fecha.Format = System.Windows.Forms.DateTimePickerFormat.Short;
                            fecha.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            fecha.Name = "campo" + nombre;
                            fecha.Size = new System.Drawing.Size(130, 20);
                            miControl = fecha;
                            tamañoLetra = (int)fecha.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "fechaHora", tipoCampoComponente.Text, fecha.Name, descripcionComponente.Text, fecha.Size.Width.ToString(), fecha.Size.Height.ToString(), fecha.Location.X.ToString(), fecha.Location.Y.ToString(), fecha.Font.Name.ToString(), tamañoLetra.ToString(), fecha.Font.Style.ToString(), fecha.ForeColor.Name.ToString());
                            //se recuperan los ids, hasta llegar a la fecha por defecto que se encuentra en la bd
                            String idTipoCampoX = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(fecha.Name, "[id tipo campo]", nombreFormulario.Text);
                            String idTipoX = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id fechaHora", "id", idTipoCampoX);
                            String campoDefectoX = controlFormulario.obtieneAtributoEspecificoTabla("fechaHora", "fecha por defecto", "correlativo", idTipoX);
                            fecha.Text = campoDefectoX;
                            break;
                        case "Incremental": //para incremental
                            NumericUpDown incremental = new NumericUpDown();
                            incremental.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            incremental.Name = "campo" + nombre;
                            miControl = incremental;
                            tamañoLetra = (int)incremental.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "incremental", tipoCampoComponente.Text, incremental.Name, descripcionComponente.Text, incremental.Size.Width.ToString(), incremental.Size.Height.ToString(), incremental.Location.X.ToString(), incremental.Location.Y.ToString(), incremental.Font.Name.ToString(), tamañoLetra.ToString(), incremental.Font.Style.ToString(), incremental.ForeColor.Name.ToString());
                            //se recuperan los ids, hasta llegar al incremental, y sacar el valor inicial
                            idTipoCampoX = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(incremental.Name, "[id tipo campo]", nombreFormulario.Text);
                            idTipoX = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id incremental", "id", idTipoCampoX);
                            campoDefectoX = controlFormulario.obtieneAtributoEspecificoTabla("incremental", "valor inicial", "correlativo", idTipoX);
                            incremental.Text = campoDefectoX;
                            break;
                        case "Binario":
                            RadioButton binario = new RadioButton();
                            binario.Location = formulario.getPunto();
                            binario.Name = nombre;
                            binario.Text = nombre;
                            miControl = binario;
                            tamañoLetra = (int)binario.Font.Size;
                            agregaLabel = false;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "binario", tipoCampoComponente.Text, binario.Name, descripcionComponente.Text, binario.Size.Width.ToString(), binario.Size.Height.ToString(), binario.Location.X.ToString(), binario.Location.Y.ToString(), binario.Font.Name.ToString(), tamañoLetra.ToString(), binario.Font.Style.ToString(), binario.ForeColor.Name.ToString());
                            //se recuperan los ids, hasta llegar al binario, y sacar el valor por defecto
                            idTipoCampoX = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(binario.Name, "[id tipo campo]", nombreFormulario.Text);
                            idTipoX = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id binario", "id", idTipoCampoX);
                            campoDefectoX = controlFormulario.obtieneAtributoEspecificoTabla("binario", "valor por defecto", "correlativo", idTipoX);
                            binario.Checked = int.Parse(campoDefectoX) == 1 ? true : false;//pregunta si el valor es uno, si es checa el combo, de otra manera lo pone en false
                            break;
                        case "Número":
                            TextBox numero = new TextBox();
                            numero.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            numero.Name = "campo" + nombre;
                            miControl = numero;
                            tamañoLetra = (int)numero.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "numero", tipoCampoComponente.Text, numero.Name, descripcionComponente.Text, numero.Size.Width.ToString(), numero.Size.Height.ToString(), numero.Location.X.ToString(), numero.Location.Y.ToString(), numero.Font.Name.ToString(), tamañoLetra.ToString(), numero.Font.Style.ToString(), numero.ForeColor.Name.ToString());
                            idTipoCampoX = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(numero.Name, "[id tipo campo]", nombreFormulario.Text);
                            idTipoX = controlFormulario.obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id numero", "id", idTipoCampoX);
                            campoDefectoX = controlFormulario.obtieneAtributoEspecificoTabla("numero", "valor por defecto", "correlativo", idTipoX);
                            numero.Text = campoDefectoX;
                            break;
                        case "Jerarquía":
                            //Agrega el campo
                            TreeView jerarquia = new TreeView();
                            jerarquia.Location = new Point(label.Location.X + label.Size.Width + 5, label.Location.Y - 1);
                            jerarquia.Name = "campo" + nombre;
                            miControl = jerarquia;
                            tamañoLetra = (int)jerarquia.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            controlFormulario.agregarComponente(nombreFormulario.Text, "jerarquia", tipoCampoComponente.Text, jerarquia.Name, descripcionComponente.Text, jerarquia.Size.Width.ToString(), jerarquia.Size.Height.ToString(), jerarquia.Location.X.ToString(), jerarquia.Location.Y.ToString(), jerarquia.Font.Name.ToString(), tamañoLetra.ToString(), jerarquia.Font.Style.ToString(), jerarquia.ForeColor.Name.ToString());
                            
                            /*TextBox jerarquia = new TextBox();
                            jerarquia.Location = new Point(label.Location.X + label.Size.Width, label.Location.Y - 1);
                            jerarquia.Name = "campo" + nombre;
                            miControl = jerarquia;
                            tamañoLetra = (int)jerarquia.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "jerarquia", tipoCampoComponente.Text, jerarquia.Name, descripcionComponente.Text, jerarquia.Size.Width.ToString(), jerarquia.Size.Height.ToString(), jerarquia.Location.X.ToString(), jerarquia.Location.Y.ToString(), jerarquia.Font.Name.ToString(), tamañoLetra.ToString(), jerarquia.Font.Style.ToString(), jerarquia.ForeColor.Name.ToString());
                            formulario.agregarControl(miControl);
                            listaComponentes.Items.Add(jerarquia.Name);
                            formulario.Refresh();
                            formulario.Focus();

                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            /*TextBox jerarquia = new TextBox();
                            jerarquia.Location = new Point(label.Location.X + label.Size.Width , label.Location.Y - 1);
                            jerarquia.Name = "campo" + nombre;
                            miControl = jerarquia;
                            tamañoLetra = (int)jerarquia.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "jerarquia", tipoCampoComponente.Text, jerarquia.Name, descripcionComponente.Text, jerarquia.Size.Width.ToString(), jerarquia.Size.Height.ToString(), jerarquia.Location.X.ToString(), jerarquia.Location.Y.ToString(), jerarquia.Font.Name.ToString(), tamañoLetra.ToString(), jerarquia.Font.Style.ToString(), jerarquia.ForeColor.Name.ToString());
                            formulario.agregarControl(miControl);
                            listaComponentes.Items.Add(jerarquia.Name);
                            formulario.Refresh();
                            formulario.Focus();

                            controlFormulario.agregarComponente(nombreFormulario.Text, "rotulo", "", nombre, descripcionComponente.Text, label.Size.Width.ToString(), label.Size.Height.ToString(), label.Location.X.ToString(), label.Location.Y.ToString(), label.Font.Name.ToString(), tamañoLetra.ToString(), label.Font.Style.ToString(), label.ForeColor.Name.ToString());
                            
                        
                            //Primero agrega el boton
                            Button botonJerarquia = new Button();
                            botonJerarquia.Click += new System.EventHandler(eligeJerarquia);
                            botonJerarquia.Location = new Point(jerarquia.Location.X + jerarquia.Size.Width + 5, jerarquia.Location.Y - 1);
                            botonJerarquia.Name = ("Boton eligir " + nombre);
                            botonJerarquia.Text = "Elegir";
                            miControl = botonJerarquia;
                            tamañoLetra = (int)botonJerarquia.Font.Size;
                            controlFormulario.agregarComponente(nombreFormulario.Text, "boton", botonJerarquia.Name, botonJerarquia.Name, descripcionComponente.Text, botonJerarquia.Size.Width.ToString(), botonJerarquia.Size.Height.ToString(), botonJerarquia.Location.X.ToString(), botonJerarquia.Location.Y.ToString(), botonJerarquia.Font.Name.ToString(), tamañoLetra.ToString(), botonJerarquia.Font.Style.ToString(), botonJerarquia.ForeColor.Name.ToString());
                            */break;
                    }
                    if (miControl != null)
                    {
                        if (agregaLabel) { formulario.agregarControl(control); }
                        if (!(miControl is Label))
                        {
                            formulario.agregarControl(miControl);
                        }
                        listaComponentes.Items.Add(nombre);
                        formulario.Refresh();
                        formulario.Focus();
                        nombreComponente.Text = "";
                        descripcionComponente.Text = "";
                    }
                }
                else { MessageBox.Show("Error en los datos del componente", "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); }
            }
        }

        private void listaComponentes_SelectedValueChanged(object sender, EventArgs e)
        {
            if (listaComponentes.SelectedItem != "")
            {
                eliminarComponente.Enabled = true;
                editaComponente.Enabled = true;
                boton_actulizar_indices_tabulacion.Enabled = true;
                boton_subir_indice_tabulacion.Enabled = true;
                boton_bajar_indice_tabulacion.Enabled = true;
            }
        }

        private void eliminarComponente_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea eliminar el componente del formulario?", "Eliminar", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                if (formularioActivo)
                {
                    formulario.buscaElimina(listaComponentes.SelectedItem.ToString());
                }
                eliminaComponente(listaComponentes.SelectedItem.ToString());
                editaComponente.Enabled = false;
                eliminarComponente.Enabled = false;
                boton_actulizar_indices_tabulacion.Enabled = false;
                boton_subir_indice_tabulacion.Enabled = false;
                boton_bajar_indice_tabulacion.Enabled = false;
            }
        }

        public void setFormularioActivo(bool activo)
        {
            formularioActivo =  activo;
            if (!activo) 
            { 
                agregaComponente_Click(null, null);
                agregaComponente.Enabled = false;
                editaComponente.Enabled = false;
                eliminarComponente.Enabled = false;
                abrirFormulario.Enabled = true;
                boton_actulizar_indices_tabulacion.Enabled = false;
                boton_subir_indice_tabulacion.Enabled = false;
                boton_bajar_indice_tabulacion.Enabled = false;
            }
        }

        public void setSize(int x, int y)
        {
            X.Text = y.ToString();
            Y.Text = x.ToString();
        }

        private void eliminarFormulario_Click_1(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea eliminar este formulario?", "Eliminar", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                controlFormulario.eliminaFormularios(nombreFormulario.Text);
                listaFormularios.Items.Remove(nombreFormulario.Text);
                if (formularioActivo)
                {
                    formulario.Close();
                }
                limpiaPanel();
                panelInVisible(false);
                if (nuevo) { nuevo = false; nombreFormulario.ReadOnly = true; }
            }
        }

        private void limpiaPanel() 
        {
            foreach (Control c in panel1.Controls) 
            {
                if (c is TextBox) { c.Text = ""; }
                if (c is ListBox) 
                { 
                    ListBox lista = (ListBox )c;
                    lista.Items.Clear();
                }
                if (c is ComboBox)
                { ComboBox combo = (ComboBox)c; combo.SelectedItem = ""; }
            }
            X.Text = "200";
            Y.Text = "200";
            agregaComponente.Enabled = false;
            editaComponente.Enabled = false;
            eliminarComponente.Enabled = false;
            nombreComponente.Enabled = false;
            descripcionComponente.Enabled = false;
            tipoCampoComponente.Enabled = false;
            tipoComponente.Enabled = false;
            anadirComponente.Enabled = false;
            guardarComoFormulario.Enabled = false;
            guardarFormulario.Enabled = false;
            boton_actulizar_indices_tabulacion.Enabled = false;
            boton_subir_indice_tabulacion.Enabled = false;
            boton_bajar_indice_tabulacion.Enabled = false;
            Foto.Image = null;
            icono = null;
        }

        private void nuevoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            limpiaPanel();
            panelInVisible(true);
            nuevo = true;
            nombreFormulario.ReadOnly = false;
            labelFechaAct.Visible = false;
            fechaActualizacionFormulario.Visible = false;
            eliminarFormulario.Enabled = false;
        }

        private void nombreFormulario_TextChanged_1(object sender, EventArgs e)
        {
            if (nuevo) 
            {
                guardarFormulario.Enabled = true;
                seHicieronCambios();
            }
        }

        private void guardarComoFormulario_Click(object sender, EventArgs e)
        {
           GuardarComoFormulario guardacomo = new GuardarComoFormulario(this);
           guardarComo = true;
           guardacomo.Show();
        }

        private void seHicieronCambios() 
        {
            guardarFormulario.Enabled = true;
        }

        private void descripcionFormulario_TextChanged(object sender, EventArgs e)
        {
            seHicieronCambios();
        }
        public void eliminaComponente(string nombreComp)
        {
            listaComponentes.Items.Remove(nombreComp);
            controlFormulario.eliminaComponente(nombreComp, nombreFormulario.Text);
            this.nombreComponente.Text = "";
            this.nombreComponente.Enabled = false;
            this.descripcionComponente.Text = "";
            this.descripcionComponente.Enabled = false;
            this.guardaComponente.Visible = false;
            boton_subir_indice_tabulacion.Enabled = false;
            boton_bajar_indice_tabulacion.Enabled = false;
        }
        
        private void tipoComponente_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (tipoComponente.SelectedIndex >= 0 && tipoComponente.SelectedIndex < tipoComponente.Items.Count)
            {
                ArrayList listaTiposCampo = new ArrayList();
                switch (tipoComponente.SelectedIndex)
                {
                    case 0:
                        break;
                    case 1:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("texto");
                        break;
                    case 2:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("lista");
                        break;
                    case 3:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("fechaHora");
                        break;
                    case 4:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("incremental");
                        break;
                    case 5:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("binario");
                        break;
                    case 6:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("numero");
                        break;
                    case 7:
                        listaTiposCampo = controlFormulario.obtieneTiposCampo("jerarquia");
                        break;
                }
                tipoCampoComponente.DataSource = listaTiposCampo;
            }
        }

        private void cargaComponentes(String nombre) 
        {
            if (nombre != "")
            {
                ArrayList lista = new ArrayList();
                lista = controlFormulario.cargaComponentes(nombre);
                for (int i = 0; i < lista.Count; ++i) 
                {
                    listaComponentes.Items.Add(lista[i]);
                }
            }
        }
        
        //Habilita los campos nombre y descripcion de un componete de la lista de componentes
        private void editaComponente_Click_1(object sender, EventArgs e)
        {
            if (listaComponentes.Enabled)
            {
                this.nombreComponente.Text = listaComponentes.SelectedItem.ToString();
                this.nombreComponente.Enabled = true;
                this.descripcionComponente.Text = controlFormulario.obtieneAtributoEspecificoComponenteFormulario(listaComponentes.SelectedItem.ToString(), "descripcion", this.nombreFormulario.Text);
                this.descripcionComponente.Enabled = true;
                this.guardaComponente.Visible = true;

            }
        }

        //Guarda los cambios realizados a un componente cuando capturar el evento de pulsar el boton de guardar componente
        private void guardaComponente_Click_1(object sender, EventArgs e)
        {
            controlFormulario.editarComponenteFormulario(this.listaComponentes.SelectedItem.ToString(), nombreComponente.Text, descripcionComponente.Text, this.nombreFormulario.Text);
            this.listaComponentes.Items.Remove(this.listaComponentes.SelectedItem.ToString());
            this.listaComponentes.Items.Add(nombreComponente.Text);
            this.nombreComponente.Text = "";
            this.nombreComponente.Enabled = false;
            this.descripcionComponente.Text = "";
            this.descripcionComponente.Enabled = false;
            this.guardaComponente.Visible = false;
        }

        //Manda a cambiar el punto en el que se encuentre el componente
        public void cambioPunto(Control componente)
        {
            controlFormulario.cambiarPunto(nombreFormulario.Text, componente.Name, componente.Location.X.ToString(), componente.Location.Y.ToString());
        }

        //Captura el evento del click en eligir la jerarquia
        public void eligeJerarquia(object sender, EventArgs e)
        {
            VentanaEligeJerarquia jerarquia = new VentanaEligeJerarquia();
            jerarquia.Show();
        }
        void boton_bajar_indice_tabulacion_Click(object sender, EventArgs e)
        {
            if (listaComponentes.SelectedItems.Count > 0)
            {
                listaComponentes.Sorted = false;
                object seleccionado = listaComponentes.SelectedItem;
                int indice = listaComponentes.Items.IndexOf(seleccionado.ToString());
                int total = listaComponentes.Items.Count;
                if (indice == total - 1)
                {
                    listaComponentes.Items.Remove(seleccionado.ToString());
                    listaComponentes.Items.Insert(0, seleccionado.ToString());
                    listaComponentes.SetSelected(0, true);
                }
                else
                {
                    listaComponentes.Items.Remove(seleccionado.ToString());
                    listaComponentes.Items.Insert(indice + 1, seleccionado.ToString());
                    listaComponentes.SetSelected(indice + 1, true);
                }
            }
        }

        void boton_subir_indice_tabulacion_Click(object sender, EventArgs e)
        {
            if (listaComponentes.SelectedItems.Count > 0)
            {
                listaComponentes.Sorted = false;
                object seleccionado = listaComponentes.SelectedItem;
                int indice = listaComponentes.Items.IndexOf(seleccionado.ToString());
                int total = listaComponentes.Items.Count;
                if (indice == 0)
                {
                    listaComponentes.Items.Remove(seleccionado.ToString());
                    listaComponentes.Items.Insert(total - 1, seleccionado.ToString());
                    listaComponentes.SetSelected(total - 1, true);
                }
                else
                {
                    listaComponentes.Items.Remove(seleccionado.ToString());
                    listaComponentes.Items.Insert(indice - 1, seleccionado.ToString());
                    listaComponentes.SetSelected(indice - 1, true);
                }
            }
        }
        void boton_actulizar_indices_tabulacion_Click(object sender, EventArgs e)
        {
            for (int x = 0; x < listaComponentes.Items.Count; x++)
            {
                controlFormulario.editar_orden_tabulacion_componente_formulario(this.listaComponentes.Items[x].ToString(), this.nombreFormulario.Text, x.ToString());
            }


        }

    }
}
